package jp.co.dailyReport.dailyReport.action;

import java.io.IOException;
import java.util.Vector;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.DynaActionForm;
import jp.co.dailyReport.Utilities;
import jp.co.dailyReport.dailyReport.DailyReport;
import jp.co.dailyReport.dailyReport.DailyReportWorkItem;
import jp.co.dailyReport.dailyReport.DailyReportWorkItemManager;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.workItem.WorkItem;
import jp.co.dailyReport.workItem.WorkItemManager;
import jp.co.dailyReport.SystemCalendar;

/**
 * 日報登録ページのボタン（追加、確定、表示、クリア）
 * が押されたときの処理を管理するクラスです。
 */
public class DailyReportConfirmAction extends Action {

	private static Logger log = Logger.getLogger(DailyReportConfirmAction.class);

	/**
	 * 日報登録ページで押されるボタン（追加、確定、表示、クリア）
	 * によって、実行する処理を制御します。<BR><BR>
	 * 
	 * 「追加」ボタンが押された場合の処理：<BR>
	 * 日報クラスのインスタンスを生成し、フィールドに値をセットし、セッションに設定します。<BR>
	 * 日報作業項目オブジェクトを、セッションに設定します。<BR><BR>
	 * 
	 * 「確定」ボタンが押された場合の処理：<BR>
	 * 日報作業項目オブジェクトの配列を、セッションに設定します。<BR><BR>
	 * 
	 * 「表示」ボタンが押された場合の処理：<BR>
	 * 表示する作業項目オブジェクトの配列を、セッションに設定します。<BR><BR>
	 * 
	 * 作業時間の「クリア」ボタンが押された場合の処理：<BR>
	 * セッションから日報作業項目オブジェクトの配列を取得して、作業時間フィールドに0をセットした後、セッションに設定します。<BR><BR>
	 * 
	 * 完成度の「クリア」ボタンが押された場合の処理：<BR>
	 * セッションから日報作業項目オブジェクトの配列を取得して、完成度フィールドに0をセットした後、セッションに設定します。<BR>
	 * 
	 * @param mapping このインスタンスを選択するために使用したActionMapping
	 * @param form 存在するならば、このリクエストのためのActionForm Bean
	 * @param request 処理しているHTTPリクエスト
	 * @param response 処理しているHTTPレスポンス
	 * @return ActionForwardインスタンス
	 * @throws IOException, ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

		log.debug("DailyReportConfirmAction start");
		HttpSession session = request.getSession();
		log.debug("session.getId() = " + session.getId());
		Staff staff = (Staff)session.getAttribute("LoginStaff");
		DailyReportWorkItem[] dailyReportWorkItems = (DailyReportWorkItem[])session.getAttribute("dailyReportWorkItem");
		DynaActionForm doDailyReportActionForm = (DynaActionForm)form;
		String target = null;
		ActionErrors errors = new ActionErrors();
		//「追加」ボタンが押された時の処理
		if(request.getParameter("add") != null) {
			target = "add";
			int workDateY = ((Integer)doDailyReportActionForm.get("workDateY")).intValue();
			int workDateM = ((Integer)doDailyReportActionForm.get("workDateM")).intValue();
			int workDateD = ((Integer)doDailyReportActionForm.get("workDateD")).intValue();
			int workingStartHoursH = ((Integer)doDailyReportActionForm.get("workingStartHoursH")).intValue();
			int workingStartHoursM = ((Integer)doDailyReportActionForm.get("workingStartHoursM")).intValue();
			int workingEndHoursH = ((Integer)doDailyReportActionForm.get("workingEndHoursH")).intValue();
			int workingEndHoursM = ((Integer)doDailyReportActionForm.get("workingEndHoursM")).intValue();
			Calendar workingStartHours = Utilities.getCalendarTime(workDateY,workDateM,workDateD,workingStartHoursH,workingStartHoursM);
			Calendar workingEndHours = Utilities.getCalendarTime(workDateY,workDateM,workDateD,workingEndHoursH,workingEndHoursM);
			DailyReport dailyReport = new DailyReport();				
			dailyReport.setWorkDate(workingStartHours);
			dailyReport.setWorkingStartHours(workingStartHours);
			dailyReport.setWorkingEndHours(workingEndHours);
			dailyReport.setDailyReportId(((Integer)doDailyReportActionForm.get("dailyReportId")).intValue());
			dailyReport.setStaffId(staff.getStaffId());
			dailyReport.setWorkDetail((String)doDailyReportActionForm.get("workDetail"));
			dailyReport.setProblem((String)doDailyReportActionForm.get("problem"));
			dailyReport.setToDo((String)doDailyReportActionForm.get("toDo"));
			dailyReport.setComment((String)doDailyReportActionForm.get("comment"));
			session.setAttribute("dailyReport", dailyReport);
			//日報作業項目を設定する
			setDailyReportWorkItem(request,dailyReportWorkItems);
		//「確定」ボタンが押された時の処理
		}else if(request.getParameter("confirm") != null) {
			target = "confirm";
			//日報作業項目を設定する
			setDailyReportWorkItem(request,dailyReportWorkItems);
		//「表示」ボタンが押された時の処理
		}else if(request.getParameter("display") != null) {
			target = "display";
			setDailyReportWorkItem(request,dailyReportWorkItems);
			dailyReportWorkItems = (DailyReportWorkItem[])session.getAttribute("dailyReportWorkItem");
			displayWorkItem(request,dailyReportWorkItems);
		//作業時間の「クリア」ボタンが押された時の処理
		}else if(request.getParameter("clearHours") != null) {
			target = "clear";
			setDailyReportWorkItem(request,dailyReportWorkItems);
			dailyReportWorkItems = (DailyReportWorkItem[])session.getAttribute("dailyReportWorkItem");
			initializeWorkItemHours(request,dailyReportWorkItems);
		//完成度の「クリア」ボタンが押された時の処理
		}else if(request.getParameter("clearCompleteness") != null) {
			target = "clear";
			setDailyReportWorkItem(request,dailyReportWorkItems);
			dailyReportWorkItems = (DailyReportWorkItem[])session.getAttribute("dailyReportWorkItem");
			initializeWorkItemCompleteness(request,dailyReportWorkItems);
		}
		dailyReportWorkItems = (DailyReportWorkItem[])session.getAttribute("dailyReportWorkItem");
		Vector pjDailyReportWorkItemList = (Vector)session.getAttribute("pjDailyReportWorkItemList");
		Vector newDrwi = new Vector();
		double workingHours = 0;
		for(int i = 0; i < pjDailyReportWorkItemList.size(); i++) {
			DailyReportWorkItem drwi = new DailyReportWorkItem();
			drwi.setWorkingHours(Double.parseDouble(request.getParameter("pjDailyReportWorkItemList1[" + i + "].workingHours")));
			workingHours = workingHours + Double.parseDouble(request.getParameter("pjDailyReportWorkItemList1[" + i + "].workingHours"));
			drwi.setCompleteness(Integer.parseInt(request.getParameter("pjDailyReportWorkItemList2[" + i + "].completeness")));
			newDrwi.add(drwi);
		}
		doDailyReportActionForm.set("staffId", new Integer(staff.getStaffId()));
		if(dailyReportWorkItems!=null){
			doDailyReportActionForm.set("totalWorkingHours", new Double(DailyReportWorkItemManager.calculate(dailyReportWorkItems) + workingHours));
			session.setAttribute("dailyReportWorkItem", dailyReportWorkItems);
		} else {
			doDailyReportActionForm.set("totalWorkingHours", new Double(workingHours));
		}

		session.setAttribute("pjDailyReportWorkItemList", newDrwi);
		request.setAttribute("systemCalendar", new SystemCalendar());

		log.debug("DailyReportConfirmAction end");
		return mapping.findForward(target);
	}

	//日報登録ページで選択された作業時間、完成度を日報作業項目クラスにセットしてセッションにセットする
	private void setDailyReportWorkItem(HttpServletRequest request,DailyReportWorkItem[] dailyReportWorkItems) {

		HttpSession session = request.getSession();
		if(dailyReportWorkItems!=null){
			for(int i = 0; i < dailyReportWorkItems.length; i++) {
				if(request.getParameter("dailyReportWorkItem1[" + i + "].workItemId")!=null){
					String completeness = request.getParameter("dailyReportWorkItem2[" + i + "].completeness");
					dailyReportWorkItems[i].setWorkItemId(Integer.parseInt(request.getParameter("dailyReportWorkItem1[" + i + "].workItemId")));
					dailyReportWorkItems[i].setWorkingHours(Double.parseDouble(request.getParameter("dailyReportWorkItem1[" + i + "].workingHours")));
					dailyReportWorkItems[i].setCompleteness(Integer.parseInt(completeness==null||completeness.equals("")?"0":completeness));
				}
			}
			session.setAttribute("dailyReportWorkItem", dailyReportWorkItems);
		}
	}

	//日報登録ページの作業項目を非表示、表示にする
	private void displayWorkItem(HttpServletRequest request,DailyReportWorkItem[] dailyReportWorkItems) {

		HttpSession session = request.getSession();
		WorkItem[] nonDisplayWorkItemList = (WorkItem[])session.getAttribute("nonDisplayWorkItemList");
		Vector dailyReportWorkItemList = new Vector();
		Vector workItemList = new Vector();

		for(int i=0;i<nonDisplayWorkItemList.length;i++){
			if(request.getParameter("nonDisplayWorkItemList1[" + i + "].workItemId")!=null) {
				//非表示の作業項目を表示作業項目に追加
				workItemList.add(nonDisplayWorkItemList[i]);
				int workItemId = nonDisplayWorkItemList[i].getWorkItemId();
				DailyReportWorkItem dailyReportWorkItem = null;
				for(int j=0;j<dailyReportWorkItems.length;j++){
					if(workItemId == dailyReportWorkItems[j].getWorkItemId()) {
						dailyReportWorkItem = dailyReportWorkItems[j];
					}
				}
				if(dailyReportWorkItem==null){
					//日報作業項目の追加
					dailyReportWorkItem = new DailyReportWorkItem();
					dailyReportWorkItem.setWorkItemId(workItemId);
					dailyReportWorkItem.setWorkingHours(0);
					dailyReportWorkItem.setCompleteness(0);
				}
				dailyReportWorkItemList.add(dailyReportWorkItem);
			}
		}
		session.setAttribute("workItemList", (WorkItem[])WorkItemManager.sortWorkItemList(workItemList).toArray(new WorkItem[0]));
		session.setAttribute("dailyReportWorkItem", (DailyReportWorkItem[])dailyReportWorkItemList.toArray(new DailyReportWorkItem[0]));
	}

	//日報登録ページの作業時間を初期化する
	private void initializeWorkItemHours(HttpServletRequest request,DailyReportWorkItem[] dailyReportWorkItems) {

		HttpSession session = request.getSession();
		for(int i=0;i<dailyReportWorkItems.length;i++){
			dailyReportWorkItems[i].setWorkingHours(0);
		}
		session.setAttribute("dailyReportWorkItem", dailyReportWorkItems);
	}

	//日報登録ページの完成度を初期化する
	private void initializeWorkItemCompleteness(HttpServletRequest request,DailyReportWorkItem[] dailyReportWorkItems) {

		HttpSession session = request.getSession();
		for(int i=0;i<dailyReportWorkItems.length;i++){
			dailyReportWorkItems[i].setCompleteness(0);
		}
		session.setAttribute("dailyReportWorkItem", dailyReportWorkItems);
	}

}
